package com.theorydance.esoperator.utils;

import cn.hutool.crypto.digest.DigestUtil;
import java.util.Map;
import java.util.TreeMap;

/**
 * 针对ak/sk进行验证的工具
 * @Author grand_ranfs
 * @Date 2023/11/16 10:43
 */
public class SignUtilCore {

    /**
     * 按签名算法获取sign（客户端和服务器端算法一致，都需要用）
     * @param appId
     * @param appSecret
     * @param ts 13位时间戳
     * @param nonce 请求唯一标识
     * @param reqParam 请求参数键值对结合
     * @return
     */
    public static String getSign(String appId, String appSecret, Long ts, String nonce, Map<String, Object> reqParam) {
        // 签名规则：sign = md5("appId=${appId}&ts=${ts}&noce=${noce}&appSecret=${appSecret}&param1=$1&param2=$2")
        // 1.请求参数key升序
        Map<String, Object> treeMap = new TreeMap<>();
        treeMap.putAll(reqParam);
        // 2.待加密字符串
        StringBuffer s = new StringBuffer()
                .append("appId=").append(appId)
                .append("ts=").append(ts)
                .append("&noce=").append(nonce)
                .append("&appSecret=").append(appSecret);
        // append : &param1=1&param2=2
        treeMap.forEach((k, v) -> s.append("&").append(k).append("=").append(v));

        // 3.对待加密字符串进行加密(对字符串md5处理，得到sign值)
        return DigestUtil.md5Hex(s.toString());
    }

}

